home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / dev / sireg.h < prev    next >
C/C++ Source or Header  |  1990-12-19  |  11KB  |  272 lines

  1.  
  2. /*    @(#)sireg.h 1.1 86/09/27 SMI    */
  3.  
  4. /*
  5.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  6.  */
  7.  
  8. /*
  9.  * Register definitions for the Sun3/50 onboard and Sun3 32-bit VME version 
  10.  * of the SCSI control logic interface. Both of these interfaces use the
  11.  * NCR 5380 SBC (SCSI Bus Controller). The main difference between these
  12.  * two interfaces is the dma interface. The Sun3/50 onboard version uses
  13.  * the AMD 9516 UDC (Universal DMA Controller).
  14.  * Since the NCR 5380 SBC chip is used, both interfaces support the SCSI
  15.  * disconnect/reconnect capability thus implying support for the scsi
  16.  * arbitration phase.
  17.  */
  18.  
  19. /*
  20.  * NCR 5380 SBC (SCSI Bus Controller) Registers.
  21.  */
  22.  
  23. /* read of sbc registers yields the following: */
  24. struct sbc_read_reg {
  25.     u_char        cdr;    /* current data register */
  26.     u_char        icr;    /* initiator command register */
  27.     u_char        mr;    /* mode register */
  28.     u_char        tcr;    /* target command register */
  29.     u_char        cbsr;    /* current bus status register */
  30.     u_char        bsr;    /* bus and status register */
  31.     u_char        idr;    /* input data register */
  32.     u_char        clr;    /* read to clear parity error, */
  33.                 /* interrupt request, and busy */
  34.                 /* failure bits in the bsr */
  35. };
  36.  
  37. /* write of sbc registers yields the following: */
  38. struct sbc_write_reg {
  39.     u_char        odr;    /* output data register */
  40.     u_char        icr;    /* initiator command register */
  41.     u_char        mr;    /* mode register */
  42.     u_char        tcr;    /* target command register */
  43.     u_char        ser;    /* select/reselect enable register */
  44.     u_char        send;    /* start dma for target/initiator send xfer */
  45.     u_char        trcv;    /* start dma for target receive transfer */
  46.     u_char        ircv;    /* start dma for initiator receive transfer */
  47. };
  48.  
  49. /* bits in the sbc initiator command register */
  50. #define    SBC_ICR_RST    0x80    /* (r/w) assert reset */
  51. #define SBC_ICR_AIP    0x40    /* (r)   arbitration in progress */
  52. #define SBC_ICR_TEST    0x40    /* (w)   test mode, disables output */
  53. #define SBC_ICR_LA    0x20    /* (r)   lost arbitration */
  54. #define SBC_ICR_DE    0x20    /* (w)   differential enable */
  55. #define SBC_ICR_ACK    0x10    /* (r/w) assert acknowledge */
  56. #define SBC_ICR_BUSY    0x08    /* (r/w) assert busy */
  57. #define SBC_ICR_SEL    0x04    /* (r/w) assert select */
  58. #define SBC_ICR_ATN    0x02    /* (r/w) assert attention */
  59. #define SBC_ICR_DATA    0x01    /* (r/w) assert data bus */
  60.  
  61. /* bits in the sbc mode register (same on read or write) */
  62. #define SBC_MR_BDMA    0x80    /* block mode dma */
  63. #define SBC_MR_TRG    0x40    /* target mode */
  64. #define SBC_MR_EPC    0x20    /* enable parity check */
  65. #define SBC_MR_EPI    0x10    /* enable parity interrupt */
  66. #define SBC_MR_EEI    0x08    /* enable eop interrupt */
  67. #define SBC_MR_MBSY    0x04    /* monitor busy */
  68. #define SBC_MR_DMA    0x02    /* dma mode */
  69. #define SBC_MR_ARB    0x01    /* arbitration mode */
  70.  
  71. /* bits in the sbc target command register */
  72. #define SBC_TCR_REQ    0x08    /* assert request */
  73. #define SBC_TCR_MSG    0x04    /* assert message */
  74. #define SBC_TCR_CD    0x02    /* assert command/data */
  75. #define SBC_TCR_IO    0x01    /* assert input/output */
  76.  
  77. /* settings of tcr to reflect different information transfer phases */
  78. #define TCR_COMMAND    (SBC_TCR_CD)
  79. #define TCR_MSG_OUT    (SBC_TCR_MSG | SBC_TCR_CD)
  80. #define TCR_DATA_OUT    0
  81. #define TCR_STATUS    (SBC_TCR_CD | SBC_TCR_IO)
  82. #define TCR_MSG_IN    (SBC_TCR_MSG | SBC_TCR_CD | SBC_TCR_IO)
  83. #define TCR_DATA_IN    (SBC_TCR_IO)
  84. #define TCR_UNSPECIFIED    (SBC_TCR_MSG)
  85.  
  86. /* bits in the sbc current bus status register */
  87. #define SBC_CBSR_RST    0x80    /* reset */
  88. #define SBC_CBSR_BSY    0x40    /* busy */
  89. #define SBC_CBSR_REQ    0x20    /* request */
  90. #define SBC_CBSR_MSG    0x10    /* message */
  91. #define SBC_CBSR_CD    0x08    /* command/data */
  92. #define SBC_CBSR_IO    0x04    /* input/output */
  93. #define SBC_CBSR_SEL    0x02    /* select */
  94. #define SBC_CBSR_DBP    0x01    /* data bus parity */
  95.  
  96. /* scsi bus signals reflecting different information transfer phases */
  97. #define CBSR_PHASE_BITS    (SBC_CBSR_CD | SBC_CBSR_MSG | SBC_CBSR_IO)
  98. #define PHASE_COMMAND    (SBC_CBSR_CD)
  99. #define PHASE_MSG_OUT    (SBC_CBSR_MSG | SBC_CBSR_CD)
  100. #define PHASE_DATA_OUT    0
  101. #define PHASE_STATUS    (SBC_CBSR_CD | SBC_CBSR_IO)
  102. #define PHASE_MSG_IN    (SBC_CBSR_MSG | SBC_CBSR_CD | SBC_CBSR_IO)
  103. #define PHASE_DATA_IN    (SBC_CBSR_IO)
  104.  
  105. /* bits in the sbc bus and status register */
  106. #define SBC_BSR_EDMA    0x80    /* end of dma */
  107. #define SBC_BSR_RDMA    0x40    /* dma request */
  108. #define SBC_BSR_PERR    0x20    /* parity error */
  109. #define SBC_BSR_INTR    0x10    /* interrupt request */
  110. #define SBC_BSR_PMTCH    0x08    /* phase match */
  111. #define SBC_BSR_BERR    0x04    /* busy error */
  112. #define SBC_BSR_ATN    0x02    /* attention */
  113. #define SBC_BSR_ACK    0x01    /* acknowledge */
  114.  
  115. /*
  116.  * AMD 9516 UDC (Universal DMA Controller) Registers.
  117.  * Sun3/50 only.
  118.  */
  119.  
  120. /* addresses of the udc registers accessed directly by driver */
  121. #define UDC_ADR_MODE        0x38    /* master mode register */
  122. #define UDC_ADR_COMMAND        0x2e    /* command register (write only) */
  123. #define UDC_ADR_STATUS        0x2e    /* status register (read only) */
  124. #define UDC_ADR_CAR_HIGH    0x26    /* chain addr reg, high word */
  125. #define UDC_ADR_CAR_LOW        0x22    /* chain addr reg, low word */
  126. #define UDC_ADR_CARA_HIGH    0x1a    /* cur addr reg A, high word */
  127. #define UDC_ADR_CARA_LOW    0x0a    /* cur addr reg A, low word */
  128. #define UDC_ADR_CARB_HIGH    0x12    /* cur addr reg B, high word */
  129. #define UDC_ADR_CARB_LOW    0x02    /* cur addr reg B, low word */
  130. #define UDC_ADR_CMR_HIGH    0x56    /* channel mode reg, high word */
  131. #define UDC_ADR_CMR_LOW        0x52    /* channel mode reg, low word */
  132. #define UDC_ADR_COUNT        0x32    /* number of words to transfer */
  133.  
  134. /* 
  135.  * For a dma transfer, the appropriate udc registers are loaded from a 
  136.  * table in memory pointed to by the chain address register.
  137.  */
  138. struct udc_table {
  139.     u_short            rsel;    /* tells udc which regs to load */
  140.     u_short            haddr;    /* high word of main mem dma address */
  141.     u_short            laddr;    /* low word of main mem dma address */
  142.     u_short            count;    /* num words to transfer */
  143.     u_short            hcmr;    /* high word of channel mode reg */
  144.     u_short            lcmr;    /* low word of channel mode reg */
  145. };
  146.  
  147. /* indicates which udc registers are to be set based on info in above table */
  148. #define UDC_RSEL_RECV        0x0182
  149. #define UDC_RSEL_SEND        0x0282
  150.  
  151. /* setting of chain mode reg: selects how the dma op is to be executed */
  152. #define UDC_CMR_HIGH        0x0040    /* high word of channel mode reg */
  153. #define UDC_CMR_LSEND        0x00c2    /* low word of cmr when send */
  154. #define UDC_CMR_LRECV        0x00d2    /* low word of cmr when receiving */
  155.  
  156. /* setting for the master mode register */
  157. #define UDC_MODE        0xd    /* enables udc chip */
  158.  
  159. /* setting for the low byte in the high word of an address */
  160. #define UDC_ADDR_INFO        0x40    /* inc addr after each word is dma'd */
  161.  
  162. /* udc commands */
  163. #define UDC_CMD_STRT_CHN    0xa0    /* start chaining */
  164. #define UDC_CMD_CIE        0x32    /* channel 1 interrupt enable */
  165. #define UDC_CMD_RESET        0x00    /* reset udc, same as hdw reset */
  166.  
  167. /* bits in the udc status register */
  168. #define UDC_SR_CIE        0x8000    /* channel interrupt enable */
  169. #define UDC_SR_IP        0x2000    /* interrupt pending */
  170. #define UDC_SR_CA        0x1000    /* channel abort */
  171. #define UDC_SR_NAC        0x0800    /* no auto reload or chaining*/
  172. #define UDC_SR_WFB        0x0400    /* waiting for bus */
  173. #define UDC_SR_SIP        0x0200    /* second interrupt pending */
  174. #define UDC_SR_HM        0x0040    /* hardware mask */
  175. #define UDC_SR_HRQ        0x0020    /* hardware request */
  176. #define UDC_SR_MCH        0x0010    /* match on upper comparator byte */
  177. #define UDC_SR_MCL        0x0008    /* match on lower comparator byte */
  178. #define UDC_SR_MC        0x0004    /* match condition ended dma */
  179. #define UDC_SR_EOP        0x0002    /* eop condition ended dma */
  180. #define UDC_SR_TC        0x0001    /* termination of count ended dma */
  181.  
  182. /*
  183.  * Misc defines 
  184.  */
  185.  
  186. /* arbitraty retry count */
  187. #define SI_NUM_RETRIES        2
  188.  
  189. /* scsi timer values, all in microseconds */
  190. #define SI_ARBITRATION_DELAY    3
  191. #define SI_BUS_CLEAR_DELAY    1
  192. #define SI_BUS_SETTLE_DELAY    1
  193. #define SI_UDC_WAIT        1
  194. #define    SI_WAIT_COUNT        250000
  195.  
  196. /* directions for dma transfers */
  197. #define SI_RECV_DATA        0
  198. #define SI_SEND_DATA        1
  199. #define SI_NO_DATA        2
  200.  
  201. /* initiator's scsi device id */
  202. #define    SI_HOST_ID        0x80
  203.  
  204. /* possible values for the address modifier, sun3 vme version only */
  205. #define VME_SUPV_DATA_24    0x3d00
  206.  
  207. /* must massage dvma addresses for Sun3/50 hardware */
  208. #define DVMA_OFFSET    (int)(DVMA - (char *)KERNELBASE)
  209.  
  210. /* 
  211.  * Register layout for the SCSI control logic interface.
  212.  * Some of these registers apply to only one interface and some
  213.  * apply to both. The registers which apply to the Sun3/50 onboard 
  214.  * version only are udc_rdata and udc_raddr. The registers which
  215.  * apply to the Sun3 vme version only are dma_addr, dma_count, bpr,
  216.  * addr_mod, int_vec, and bcrh. Thus, the sbc registers, fifo_data, 
  217.  * bcr, and csr apply to both interfaces.
  218.  * One other feature of the vme interface: a write to the dma count 
  219.  * register also causes a write to the fifo byte count register and
  220.  * vis versa.
  221.  */
  222. struct scsi_si_reg {
  223.     union {
  224.         struct sbc_read_reg    read;    /* scsi bus ctlr, read reg */
  225.         struct sbc_write_reg    write;    /* scsi bus ctlr, write reg */
  226.     } sbc;
  227. #define sbc_rreg sbc.read
  228. #define sbc_wreg sbc.write
  229.     u_int            dma_addr;    /* dma address register */
  230.     u_int            dma_count;    /* dma count register */
  231.     u_short            udc_rdata;    /* univ dma ctlr, reg data */
  232.     u_short            udc_raddr;    /* univ dma ctlr, reg addr */
  233.     u_short            fifo_data;    /* fifo data register */
  234.                         /* holds extra byte on odd */
  235.                         /* byte dma read */
  236.     u_short            bcr;        /* fifo byte count reg */
  237.     u_short            csr;        /* control/status register */
  238.     u_int            bpr;        /* byte pack register */
  239.     u_short            iv_am;        /* address modifier and */
  240.                         /* interrupt vector reg */
  241.     u_short            bcrh;        /* high portion of bcr */
  242. };
  243.  
  244. /*
  245.  * Status Register.
  246.  * Note:
  247.  *    (r)    indicates bit is read only.
  248.  *    (rw)    indicates bit is read or write.
  249.  *    (v)    vme host adaptor interface only.
  250.  *    (o)    sun3/50 onboard host adaptor interface only.
  251.  *    (b)    both vme and sun3/50 host adaptor interfaces.
  252.  */
  253. #define SI_CSR_DMA_ACTIVE    0x8000    /* (r,o) dma transfer active */
  254. #define SI_CSR_DMA_CONFLICT    0x4000    /* (r,b) reg accessed while dmaing */
  255. #define SI_CSR_DMA_BUS_ERR    0x2000    /* (r,b) bus error during dma */
  256. #define SI_CSR_UNUSED        0x1000    /* (r,b) always read as zero */
  257. #define SI_CSR_FIFO_FULL    0x0800    /* (r,b) fifo full */
  258. #define SI_CSR_FIFO_EMPTY    0x0400    /* (r,b) fifo empty */
  259. #define SI_CSR_SBC_IP        0x0200    /* (r,b) sbc interrupt pending */
  260. #define SI_CSR_DMA_IP        0x0100    /* (r,b) dma interrupt pending */
  261. #define SI_CSR_LOB        0x00c0    /* (r,v) number of leftover bytes */
  262. #define SI_CSR_LOB_THREE    0x00c0    /* (r,v) three leftover bytes */
  263. #define SI_CSR_LOB_TWO        0x0080    /* (r,v) two leftover bytes */
  264. #define SI_CSR_LOB_ONE        0x0040    /* (r,v) one leftover byte */
  265. #define SI_CSR_BPCON        0x0020    /* (rw,v) byte packing control */
  266.                     /* dma is in 0=longwords, 1=words */
  267. #define SI_CSR_DMA_EN        0x0010    /* (rw,v) dma enable */
  268. #define SI_CSR_SEND        0x0008    /* (rw,b) dma dir, 1=to device */
  269. #define SI_CSR_INTR_EN        0x0004    /* (rw,b) interrupts enable */
  270. #define SI_CSR_FIFO_RES        0x0002    /* (rw,b) inits fifo, 0=reset */
  271. #define SI_CSR_SCSI_RES        0x0001    /* (rw,b) reset sbc and udc, 0=reset */
  272.